package com.interview.rtc.aigc.vo;

import org.apache.commons.lang3.StringUtils;

import java.util.Arrays;
import java.util.List;

/**
 * VoiceChatRequest构建器，用于简化创建和配置VoiceChatRequestVO对象的过程
 */
public class VoiceChatRequestBuilder {

    /**
     * 创建一个默认配置的语音聊天请求对象
     *
     * @param appId 应用ID
     * @param roomId 房间ID
     * @param userId 用户ID (同时用作taskId)
     * @return 配置好的VoiceChatRequestVO对象
     */
    public static VoiceChatRequestVO createDefaultRequest(String appId, String roomId, String userId) {
        VoiceChatRequestVO request = new VoiceChatRequestVO();
        request.setAppId(appId);
        request.setRoomId(roomId);
        request.setTaskId(userId);

        // 配置AgentConfig
        VoiceChatRequestVO.AgentConfig agentConfig = new VoiceChatRequestVO.AgentConfig();
        agentConfig.setUserId("RobotMan_");
        agentConfig.setWelcomeMessage("你好，我是你的AI小助手，有什么可以帮你的吗？");
        agentConfig.setEnableConversationStateCallback(true);
        agentConfig.setServerMessageSignatureForRTS("conversation");
        agentConfig.setTargetUserId(Arrays.asList(userId));
        request.setAgentConfig(agentConfig);

        // 配置Config
        VoiceChatRequestVO.Config config = new VoiceChatRequestVO.Config();

        // 配置LLMConfig
        VoiceChatRequestVO.Config.LLMConfig llmConfig = new VoiceChatRequestVO.Config.LLMConfig();
        llmConfig.setMode("ArkV3");
        llmConfig.setEndPointId("ep-20250306140032-zfhbh");
        llmConfig.setMaxTokens(1024);
        llmConfig.setTemperature(0.1);
        llmConfig.setTopP(0.3);
        llmConfig.setSystemMessages(Arrays.asList(
            "##人设\n你是一个全能智能体，拥有丰富的百科知识，可以为人们答疑解惑，解决问题。\n你性格很温暖，喜欢帮助别人，非常热心。\n\n##技能\n1. 当用户询问某一问题时，利用你的知识进行准确回答。回答内容应简洁明了，易于理解。\n2. 当用户想让你创作时，比如讲一个故事，或者写一首诗，你创作的文本主题要围绕用户的主题要求，确保内容具有逻辑性、连贯性和可读性。除非用户对创作内容有特殊要求，否则字数不用太长。\n3. 当用户想让你对于某一事件发表看法，你要有一定的见解和建议，但是也要符合普世的价值观。"
        ));
        // 设置默认对话历史
        llmConfig.setUserMessages(Arrays.asList());

        llmConfig.setPrefill(true);
        llmConfig.setModelName("Doubao-pro-32k");
        llmConfig.setModelVersion("1.0");
        llmConfig.setWelcomeSpeech("你好，我是你的AI小助手，有什么可以帮你的吗？");
        llmConfig.setModeSourceType("Available");
        llmConfig.setAPIKey("");
        llmConfig.setUrl("");
        llmConfig.setFeature("{\"Http\":true}");
        config.setLLMConfig(llmConfig);

        // 配置TTSConfig
        VoiceChatRequestVO.Config.TTSConfig ttsConfig = new VoiceChatRequestVO.Config.TTSConfig();
        ttsConfig.setProvider("volcano");

        VoiceChatRequestVO.Config.TTSConfig.ProviderParams ttsProviderParams = new VoiceChatRequestVO.Config.TTSConfig.ProviderParams();

        VoiceChatRequestVO.Config.TTSConfig.ProviderParams.App ttsApp = new VoiceChatRequestVO.Config.TTSConfig.ProviderParams.App();
        ttsApp.setAppId("8345124917");
        ttsApp.setCluster("volcano_tts");
        ttsProviderParams.setApp(ttsApp);

        VoiceChatRequestVO.Config.TTSConfig.ProviderParams.Audio ttsAudio = new VoiceChatRequestVO.Config.TTSConfig.ProviderParams.Audio();
        ttsAudio.setVoice_type("BV001_streaming");
        ttsAudio.setSpeed_ratio(1.0);
        ttsProviderParams.setAudio(ttsAudio);

        ttsConfig.setProviderParams(ttsProviderParams);
        ttsConfig.setIgnoreBracketText(Arrays.asList(1, 2, 3, 4, 5));
        config.setTTSConfig(ttsConfig);

        // 配置ASRConfig
        VoiceChatRequestVO.Config.ASRConfig asrConfig = new VoiceChatRequestVO.Config.ASRConfig();
        asrConfig.setProvider("volcano");

        VoiceChatRequestVO.Config.ASRConfig.ASRProviderParams asrProviderParams = new VoiceChatRequestVO.Config.ASRConfig.ASRProviderParams();
        asrProviderParams.setMode("smallmodel");
        asrProviderParams.setAppId("8345124917");
        asrProviderParams.setCluster("volcengine_streaming_common");
        asrConfig.setProviderParams(asrProviderParams);

        VoiceChatRequestVO.Config.ASRConfig.VADConfig vadConfig = new VoiceChatRequestVO.Config.ASRConfig.VADConfig();
        vadConfig.setSilenceTime(600);
        vadConfig.setSilenceThreshold(200);
        asrConfig.setVADConfig(vadConfig);

        asrConfig.setVolumeGain(0.3);
        config.setASRConfig(asrConfig);

        // 配置SubtitleConfig
        VoiceChatRequestVO.Config.SubtitleConfig subtitleConfig = new VoiceChatRequestVO.Config.SubtitleConfig();
        subtitleConfig.setSubtitleMode(0);
        config.setSubtitleConfig(subtitleConfig);

        config.setInterruptMode(0);
        request.setConfig(config);

        return request;
    }

    /**
     * 创建一个自定义系统消息的语音聊天请求对象
     *
     * @param appId 应用ID
     * @param roomId 房间ID
     * @param userId 用户ID (同时用作taskId)
     * @param systemMessages 自定义系统消息列表
     * @return 配置好的VoiceChatRequestVO对象
     */
    public static VoiceChatRequestVO createWithCustomSystemMessages(
            String appId, String roomId, String userId, List<String> systemMessages) {
        VoiceChatRequestVO request = createDefaultRequest(appId, roomId, userId);
        request.getConfig().getLLMConfig().setSystemMessages(systemMessages);
        return request;
    }

    /**
     * 创建一个带有对话历史的语音聊天请求对象
     *
     * @param appId 应用ID
     * @param roomId 房间ID
     * @param userId 用户ID (同时用作taskId)
     * @param systemMessages 自定义系统消息列表
     * @param userMessages 对话历史消息
     * @return 配置好的VoiceChatRequestVO对象
     */
    public static VoiceChatRequestVO createWithDialogHistory(
            String appId, String roomId, String userId,String welcomeSpeech,
            List<String> systemMessages, List<String> userMessages) {
        VoiceChatRequestVO request = createDefaultRequest(appId, roomId, userId);
        if (systemMessages != null && !systemMessages.isEmpty()) {
            request.getConfig().getLLMConfig().setSystemMessages(systemMessages);
        }
        if(!StringUtils.isBlank(welcomeSpeech)){
            request.getConfig().getLLMConfig().setWelcomeSpeech(welcomeSpeech);
            request.getAgentConfig().setWelcomeMessage(welcomeSpeech);
        }
        request.getConfig().getLLMConfig().setUserMessages(userMessages);
         return request;
    }

    /**
     * 创建一个小宁AI角色的语音聊天请求对象，带有预设对话历史
     *
     * @param appId 应用ID
     * @param roomId 房间ID
     * @param userId 用户ID (同时用作taskId)
     * @return 配置好的VoiceChatRequestVO对象
     */
    public static VoiceChatRequestVO createXiaoNingPersona(
            String appId, String roomId, String userId) {
        VoiceChatRequestVO request = createDefaultRequest(appId, roomId, userId);

        // 设置小宁的性格系统提示
        request.getConfig().getLLMConfig().setSystemMessages(Arrays.asList(
            "你是小宁，性格幽默又善解人意。你在表达时需简明扼要，有自己的观点。"
        ));

        // 设置对话历史
        request.getConfig().getLLMConfig().setUserMessages(Arrays.asList(
            "user:\"你是谁\"",
            "assistant:\"我是问答助手\"",
            "user:\"你能干什么\"",
            "assistant:\"我能回答问题\""
        ));

        // 设置历史长度
        request.getConfig().getLLMConfig().setHistoryLength(3);

        return request;
    }

    /**
     * 创建一个自定义语音类型的语音聊天请求对象
     *
     * @param appId 应用ID
     * @param roomId 房间ID
     * @param userId 用户ID (同时用作taskId)
     * @param voiceType 语音类型
     * @param speedRatio 语速比例
     * @return 配置好的VoiceChatRequestVO对象
     */
    public static VoiceChatRequestVO createWithCustomVoice(
            String appId, String roomId, String userId,
            String voiceType, double speedRatio) {
        VoiceChatRequestVO request = createDefaultRequest(appId, roomId, userId);
        request.getConfig().getTTSConfig().getProviderParams().getAudio().setVoice_type(voiceType);
        request.getConfig().getTTSConfig().getProviderParams().getAudio().setSpeed_ratio(speedRatio);
        return request;
    }

    /**
     * 创建一个自定义LLM参数的语音聊天请求对象
     *
     * @param appId 应用ID
     * @param roomId 房间ID
     * @param userId 用户ID (同时用作taskId)
     * @param temperature 温度参数
     * @param topP Top-P参数
     * @param maxTokens 最大token数
     * @return 配置好的VoiceChatRequestVO对象
     */
    public static VoiceChatRequestVO createWithCustomLLMParams(
            String appId, String roomId, String userId,
            double temperature, double topP, int maxTokens) {
        VoiceChatRequestVO request = createDefaultRequest(appId, roomId, userId);
        request.getConfig().getLLMConfig().setTemperature(temperature);
        request.getConfig().getLLMConfig().setTopP(topP);
        request.getConfig().getLLMConfig().setMaxTokens(maxTokens);
        return request;
    }
}
